package com.lqk.demo.jmm.visibility;

import lombok.extern.slf4j.Slf4j;

import static com.lqk.demo.n2.util.Sleeper.sleep;
/**
 * @author lqk
 * @date 2021/12/25 11:15
 *
 * main 线程对 run 变量的修改对于 t 线程不可见，导致了 t 线程无法停止：
 *  1. 初始状态， t 线程刚开始从主内存读取了 run 的值到工作内存。
 *  2. 因为 t 线程要频繁从主内存中读取 run 的值，JIT 编译器会将 run 的值缓存至自己工作内存中的高速缓存中，
 *     减少对主存中 run 的访问，提高效率
 *  3. 1 秒之后，main 线程修改了 run 的值，并同步至主存，而 t 是从自己工作内存中的高速缓存中读取这个变量
 *     的值，结果永远是旧值
 */
@Slf4j
public class TestVisibility1 {
    static boolean run = true;
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (run){

            }
        });
        t.start();
        sleep(1);

        log.debug("停止线程t");
        run = false;    // 线程没有像我们预想的那样停止
    }
}
